/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase PantallaRondasLista se instancia en distintas parte de la aplicación
*
* @see Ronda, Prueba
*/
package edu.uoc.tds.pec4.swingx;

import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Prueba;
import edu.uoc.tds.pec4.model.Ronda;
import edu.uoc.tds.pec4.model.TipoRonda;

//Fernando
public class PantallaRondasLista extends javax.swing.JDialog {
    //Declaro las variables que se utilizarán a lo largo de la clase
    private RemotoInterface remoto;

    private DefaultTableModel modeloTabla;
    private Object datosTabla[][];
    private Object nombresDeColumnaTabla[];

    private JTable jtablaRondas;
    private JScrollPane jScrollPaneRondas;

    //Constructor de la clase que recibe como parametros el formulario que lo llama y un booleano que indica el caracter modal o no del formulario
    public PantallaRondasLista(PantallaMenuPrincipal pantallaMenuPrincipal, boolean modal) {
        //Asigno valores a las variables de clase
        this.remoto = pantallaMenuPrincipal.getRemoto();
        
        initComponents();
        myInitComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBarraHerramientas = new javax.swing.JToolBar();
        btnExit = new javax.swing.JButton();
        jPanelRondas = new javax.swing.JPanel();
        jbtnAceptar = new javax.swing.JButton();
        jmnuBarRondas = new javax.swing.JMenuBar();
        jmnuArchivo = new javax.swing.JMenu();
        jmnuSalir = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("eOlympics - Pruebas");

        jToolBarraHerramientas.setRollover(true);

        btnExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Exit.png"))); // NOI18N
        btnExit.setToolTipText("Salir");
        btnExit.setFocusable(false);
        btnExit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnExit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitsalir(evt);
            }
        });
        jToolBarraHerramientas.add(btnExit);

        javax.swing.GroupLayout jPanelRondasLayout = new javax.swing.GroupLayout(jPanelRondas);
        jPanelRondas.setLayout(jPanelRondasLayout);
        jPanelRondasLayout.setHorizontalGroup(
            jPanelRondasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 508, Short.MAX_VALUE)
        );
        jPanelRondasLayout.setVerticalGroup(
            jPanelRondasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 274, Short.MAX_VALUE)
        );

        jbtnAceptar.setText("Aceptar");
        jbtnAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAceptarActionPerformed(evt);
            }
        });

        jmnuArchivo.setText("Archivo");
        jmnuArchivo.setFont(new java.awt.Font("Tahoma", 1, 11));

        jmnuSalir.setText("Salir");
        jmnuSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmnuSalirActionPerformed(evt);
            }
        });
        jmnuArchivo.add(jmnuSalir);

        jmnuBarRondas.add(jmnuArchivo);

        setJMenuBar(jmnuBarRondas);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(464, Short.MAX_VALUE))
            .addComponent(jPanelRondas, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(427, Short.MAX_VALUE)
                .addComponent(jbtnAceptar)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelRondas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jbtnAceptar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-516)/2, (screenSize.height-417)/2, 516, 417);
    }// </editor-fold>//GEN-END:initComponents

    //Fernando
    //Metodo asociado al evento salir
    private void btnExitsalir(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitsalir
        this.setVisible(false);
}//GEN-LAST:event_btnExitsalir

    //Fernando
    //Metodo para mostrar la ronda seleccionada
    private void jbtnAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAceptarActionPerformed
        this.mostrarRonda();
}//GEN-LAST:event_jbtnAceptarActionPerformed

    //Fernando
    //Metodo asociado al evento salir
    private void jmnuSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmnuSalirActionPerformed
        this.setVisible(false);
    }//GEN-LAST:event_jmnuSalirActionPerformed

    //Fernando
    //Metodo para actualizar los datos de la tabla
    private void actualizarDatosTabla(){
        this.limpiarTabla();
        this.rellenarTablaRondas();
    }

    /**
     * Metodo para crear y definir un objeto tipo jtable, asignando sus propiedades fundamentales
     * {pre: la clase ha de estar instanciada previamente y el objeto definido}
     * {post: establece los nombres de columna y el modeloTabla predeterminado}
     */
    private void crearTabla(){
        try{
            this.datosTabla = new Object [][]{};

            //Variables para asignar texto a la cabecera de la tabla
            String textoCabecera1;
            String textoCabecera2;
            String textoCabecera3;

            textoCabecera1 = GestorIdiomas.getMessage("pantallaRondasLista.textoCabecera1");
            textoCabecera2 = GestorIdiomas.getMessage("pantallaRondasLista.textoCabecera2");
            textoCabecera3 = GestorIdiomas.getMessage("pantallaRondasLista.textoCabecera3");

            this.nombresDeColumnaTabla = new String []{textoCabecera1, textoCabecera2, textoCabecera3};

            this.modeloTabla = new DefaultTableModel(this.datosTabla,this.nombresDeColumnaTabla);
            
            this.jtablaRondas.setModel(this.modeloTabla);
            this.jScrollPaneRondas.setViewportView(this.jtablaRondas);
            
            //Colocamos la tabla en la posición definida
            javax.swing.GroupLayout jPanelTablaLayout = new javax.swing.GroupLayout(jPanelRondas);
            jPanelRondas.setLayout(jPanelTablaLayout);
            jPanelTablaLayout.setHorizontalGroup(
                jPanelTablaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanelTablaLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPaneRondas, javax.swing.GroupLayout.DEFAULT_SIZE, 466, Short.MAX_VALUE)
                    .addContainerGap())
            );

            jPanelTablaLayout.setVerticalGroup(
                jPanelTablaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelTablaLayout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addComponent(jScrollPaneRondas, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            );
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("pantallaRondasLista.errorgeneral"), GestorIdiomas.getMessage("pantallaRondasLista.errorTitulo"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Metodo para inicializar los componentes contenidos y asociados a un objeto jtable
     * {pre: el objeto jtable ha de estar creado
     * {post: permite que el objeto este disponible para mostrar nuevos datos
     */
    private void limpiarTabla(){
        for(int fila = this.modeloTabla.getRowCount()-1; fila >= 0; fila--){
            this.modeloTabla.removeRow(fila);
        }
    }

    /**
     * Metodo para rellenar los resultados de la participacion en un jtable sin diferenciar por universidad
     * {pre: la clase ha de estar instanciada previamente y el objeto definido}
     * {post: establece contenidos, la valoracion, de las celdas, informando del numero de respuestas por cada tipo de pregunta/respuesta}
     */
    public void rellenarTablaRondas(){
        //Mediante un bucle iremos rellenando la informacion de la tabla en base a los datos pasados
        //  por parametro
        try{
            for(Ronda ronda: this.remoto.getListaRondas()){
                int id_Prueba = ronda.getId_prueba();
                int id_tipoRonda = ronda.getId_tipo_ronda();

                //Definimos una cadena para almacenar la descripcion del tipo de ronda
                String descripcionTipoRonda;
                descripcionTipoRonda = this.remoto.getDescripcionTipoRonda(id_tipoRonda);

                //Instanciamos una clase prueba de la que mostraremos informacion
                Prueba prueba;
                String descripcionPrueba;
                prueba = this.remoto.getPrueba(id_Prueba);
                descripcionPrueba = this.remoto.getDescripcionPrueba(prueba);
                
                //Añadimos la fila con los datos correspondientes
                this.modeloTabla.addRow(new Object[]{id_Prueba, descripcionPrueba, descripcionTipoRonda});
            }
        }

        /** Capturamos excepcion asociada al servidor remoto*/
        catch (RemoteException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("pantallaRondasLista.errorTitulo"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("pantallaRondasLista.errorgeneral"), GestorIdiomas.getMessage("pantallaRondasLista.errorTitulo"), JOptionPane.ERROR_MESSAGE);
        }
    }

    //Fernando
    //Metodo que utilizo para mostrar en el formulario PantallaRondasLista el registro seleccionado
    private void mostrarRonda(){
        int idprueba = 0;
        int fila = 0;
        String sTipoRonda;
        TipoRonda tipoRonda;

        //En el caso de error lanzaremos la excepcion
        try {
            fila = this.jtablaRondas.getSelectedRow();
            idprueba = (Integer) this.jtablaRondas.getValueAt(fila,0);
            sTipoRonda = (String) this.jtablaRondas.getValueAt(fila,2);

            if(sTipoRonda.equals("CLASIFICATORIA"))
                tipoRonda = TipoRonda.CLASIFICATORIA;
            else
                tipoRonda = TipoRonda.ELIMINATORIA;

            Ronda ronda = new Ronda();
            ronda.setId_prueba(idprueba);
            ronda.setId_tipo_ronda(tipoRonda.valor());
            
            //Muestra la pantalla de las rondas para establecer las preguntas, las soluciones y
            //  todos los campos necesarios
            PantallaRondas pantallaRondas = new PantallaRondas(this, false, ronda, this.remoto);
            pantallaRondas.setVisible(true);
        }

        //En el caso en que el valor del idprueba este fuera de rango
        catch(ArrayIndexOutOfBoundsException exc){
            exc.printStackTrace();
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("pantallaRondasLista.ElijaUnaPrueba"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }


        //Para cualquier otra excepcion de caracter general
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("pantallaRondasLista.errorgeneral"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                PantallaPruebas dialog = null;
                try {
                    dialog = new PantallaPruebas(new PantallaMenuPrincipal(), true);
                }

                catch (RemoteException ex) {
                    Logger.getLogger(PantallaRondasLista.class.getName()).log(Level.SEVERE, null, ex);
                }

                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    //Fernando
    //Metodo para inicializar y asignar valores a los controles que se muestran por paantalla
    private void myInitComponents(){
        this.jScrollPaneRondas = new JScrollPane();
        this.jtablaRondas = new JTable();

        this.jPanelRondas.add(this.jScrollPaneRondas);

        this.jmnuArchivo.setText(GestorIdiomas.getMessage("pantallaRondasLista.MenuArchivo"));
        this.jmnuSalir.setText(GestorIdiomas.getMessage("pantallaRondasLista.MenuSalir"));
        this.jbtnAceptar.setText(GestorIdiomas.getMessage("pantallaRondasLista.BotonAceptar"));
       
        this.btnExit.setToolTipText(GestorIdiomas.getMessage("btnExit.tooltiptext"));

        this.setTitle(GestorIdiomas.getMessage("pantallaRondas.Titulo"));

        this.crearTabla();
        this.actualizarDatosTabla();
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnExit;
    private javax.swing.JPanel jPanelRondas;
    private javax.swing.JToolBar jToolBarraHerramientas;
    private javax.swing.JButton jbtnAceptar;
    private javax.swing.JMenu jmnuArchivo;
    private javax.swing.JMenuBar jmnuBarRondas;
    private javax.swing.JMenuItem jmnuSalir;
    // End of variables declaration//GEN-END:variables

}
